<?php

namespace app\behavior;

use think\facade\Config;
use think\facade\Cookie;
use think\facade\Lang;
use think\facade\Request;

/**
 * 语言行为扩展
 * 用于在应用初始化时自动设置语言环境
 */
class Language
{
    public function appInit()
    {
        // 获取语言设置的优先级（适配前后端分离）：
        // 1. URL参数中的lang
        // 2. 请求头中的Accept-Language或X-Language
        // 3. Cookie中的think_lang（兼容传统模式）
        // 4. 配置文件中的default_lang
        
        $lang = Request::param('lang');
        
        // 前后端分离：从请求头获取语言
        if (!$lang) {
            // 优先检查自定义语言头
            $lang = Request::header('X-Language') ?: Request::header('x-language');
        }
        
        if (!$lang) {
            // 检查标准Accept-Language头
            $acceptLang = Request::header('Accept-Language');
            if ($acceptLang) {
                // 解析Accept-Language头，提取主要语言代码
                $langParts = explode(',', $acceptLang);
                $primaryLang = trim(explode(';', $langParts[0])[0]);
                
                // 映射到支持的语言
                $langMap = [
                    'zh' => 'zh-cn',
                    'zh-cn' => 'zh-cn',
                    'zh-hans' => 'zh-cn',
                    'en' => 'en-us',
                    'en-us' => 'en-us',
                    'ja' => 'ja-jp',
                    'ja-jp' => 'ja-jp',
                    'be' => 'be-by',
                    'be-by' => 'be-by'
                ];
                
                $lang = $langMap[strtolower($primaryLang)] ?? null;
            }
        }
        
        if (!$lang) {
            $lang = Cookie::get('think_lang');
        }
        
        if (!$lang) {
            $lang = Config::get('app.default_lang', 'zh-cn');
        }
        
        // 检查语言是否在允许的语言列表中
        $allowLangList = Config::get('app.lang_list', ['zh-cn']);
        if (!in_array($lang, $allowLangList)) {
            $lang = Config::get('app.default_lang', 'zh-cn');
        }
        
        // 设置当前语言
        Lang::range($lang);
        
        // 加载对应的语言包 - 加载所有模块
        $this->loadAllLanguageModules($lang);
        
        // 如果URL参数中有lang，更新Cookie（兼容传统模式）
        if (Request::param('lang') && in_array(Request::param('lang'), $allowLangList)) {
            Cookie::set('think_lang', Request::param('lang'));
        }
    }

    /**
     * 加载所有语言模块
     * 
     * @param string $lang 语言代码
     */
    private function loadAllLanguageModules($lang)
    {
        $langPath = app()->getAppPath() . 'lang/' . $lang . '/';
        
        // 检查语言目录是否存在
        if (!is_dir($langPath)) {
            return;
        }
        
        // 动态扫描所有 .php 语言文件
        $langFiles = glob($langPath . '*.php');
        
        if (empty($langFiles)) {
            return;
        }
        
        // 定义加载优先级（common 最先加载）
        $priorityModules = [];
        $otherModules = [];
        
        foreach ($langFiles as $langFile) {
            $module = basename($langFile, '.php');
            if ($module === 'common') {
                $priorityModules[] = $langFile;
            } else {
                $otherModules[] = $langFile;
            }
        }
        
        // 按文件名排序其他模块
        sort($otherModules);
        
        // 合并所有模块（common 优先）
        $allLangFiles = array_merge($priorityModules, $otherModules);
        
        // 加载所有模块
        foreach ($allLangFiles as $langFile) {
            if (file_exists($langFile)) {
                try {
                    Lang::load($langFile);
                } catch (\Exception $e) {
                    // 静默处理加载失败的情况
                }
            }
        }
    }
}
